From 64891890fb680a348dd516cfae3bff4043228411 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Mon, 31 Dec 2001 17:58:04 +0000 Subject: [PATCH] extend selection if shift is down, bug #50939 2001-12-31 Havoc Pennington * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend selection if shift is down, bug #50939 (gtk_text_view_button_press_event): add double/triple click selection to the current selection if shift is down --- ChangeLog | 7 +++++ ChangeLog.pre-2-0 | 7 +++++ ChangeLog.pre-2-10 | 7 +++++ ChangeLog.pre-2-2 | 7 +++++ ChangeLog.pre-2-4 | 7 +++++ ChangeLog.pre-2-6 | 7 +++++ ChangeLog.pre-2-8 | 7 +++++ gtk/gtktextview.c | 67 +++++++++++++++++++++++++++++++++++++++------- 8 files changed, 106 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7cc0af0eaf..04e2b898c6 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,10 @@ +2001-12-31 Havoc Pennington + + * gtk/gtktextview.c (gtk_text_view_start_selection_drag): extend + selection if shift is down, bug #50939 + (gtk_text_view_button_press_event): add double/triple click + selection to the current selection if shift is down + 2001-12-31 Havoc Pennington * gtk/gtktextiter.c (gtk_text_iter_get_visible_line_index): fix diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 8297329f66..9d46cd092c 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -3513,8 +3513,8 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event) event->type == GDK_3BUTTON_PRESS) && event->button == 1) { - GtkTextIter start, end; - + GtkTextIter start, end; + /* End the selection drag, otherwise we'd clear the new * word/line selection on button release */ @@ -3560,12 +3560,28 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event) } } - gtk_text_buffer_move_mark (get_buffer (text_view), - gtk_text_buffer_get_selection_bound (get_buffer (text_view)), - &start); - gtk_text_buffer_move_mark (get_buffer (text_view), - gtk_text_buffer_get_insert (get_buffer (text_view)), - &end); + if (event->state & GDK_SHIFT_MASK) + { + /* Take union of old and new selection */ + GtkTextIter old_start, old_end; + + gtk_text_buffer_get_selection_bounds (get_buffer (text_view), + &old_start, &old_end); + + gtk_text_iter_order (&start, &old_start); + gtk_text_iter_order (&old_end, &end); + + /* Now start is the first of the starts, and end is the + * last of the ends + */ + } + + gtk_text_buffer_move_mark_by_name (get_buffer (text_view), + "selection_bound", + &start); + gtk_text_buffer_move_mark_by_name (get_buffer (text_view), + "insert", + &end); text_view->just_selected_element = TRUE; @@ -4590,14 +4606,45 @@ gtk_text_view_start_selection_drag (GtkTextView *text_view, GdkEventButton *button) { GtkTextIter newplace; - + GtkTextBuffer *buffer; + g_return_if_fail (text_view->selection_drag_handler == 0); gtk_grab_add (GTK_WIDGET (text_view)); + buffer = get_buffer (text_view); + newplace = *iter; - gtk_text_buffer_place_cursor (get_buffer (text_view), &newplace); + if (button->state & GDK_SHIFT_MASK) + { + /* Extend selection */ + GtkTextIter start, end; + + gtk_text_buffer_get_selection_bounds (buffer, &start, &end); + + if (gtk_text_iter_compare (&newplace, &start) <= 0) + { + gtk_text_buffer_move_mark_by_name (buffer, "insert", + &newplace); + + gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", + &end); + } + else if (gtk_text_iter_compare (&newplace, &end) >= 0) + { + gtk_text_buffer_move_mark_by_name (buffer, "insert", + &newplace); + + gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", + &start); + } + } + else + { + /* Replace selection */ + gtk_text_buffer_place_cursor (buffer, &newplace); + } text_view->selection_drag_handler = gtk_signal_connect (GTK_OBJECT (text_view), "motion_notify_event", -- 2.30.2